package zaplog

import (
	"go.uber.org/zap"
	"go.uber.org/zap/zapcore"
	"gopkg.in/natefinch/lumberjack.v2"
	"os"
)

type ZapLog struct {
	*zap.Logger
}

func NewZapLog() *ZapLog {
	coreList := make([]zapcore.Core, 0)
	//==================================在终端输出==================================
	encoder := zapcore.NewConsoleEncoder(zap.NewDevelopmentEncoderConfig())
	coreList = append(coreList, zapcore.NewCore(encoder, zapcore.AddSync(os.Stdout), zapcore.DebugLevel))
	//==================================输出文件info==================================
	infoJackLogger := &lumberjack.Logger{
		Filename:   "./logs/info.log", // 日志文件路径
		MaxSize:    50,                // 每个日志文件的最大大小（单位：M）
		MaxBackups: 30,                // 日志文件最多保存多少个备份
		MaxAge:     30,                // 文件最多保存多少天
		LocalTime:  true,              // 使用本地时间
		Compress:   false,             // 是否压缩
	}
	coreList = append(coreList, zapcore.NewCore(encoder, zapcore.AddSync(infoJackLogger), zapcore.InfoLevel))

	//==================================输出文件error==================================
	errorJackLogger := &lumberjack.Logger{
		Filename:   "./errors/error.log", // 日志文件路径
		MaxSize:    50,                   // 每个日志文件的最大大小（单位：M）
		MaxAge:     30,                   // 文件最多保存多少天
		MaxBackups: 30,                   // 日志文件最多保存多少个备份
		LocalTime:  true,                 // 使用本地时间
		Compress:   false,                // 是否压缩
	}
	coreList = append(coreList, zapcore.NewCore(encoder, zapcore.AddSync(errorJackLogger), zapcore.ErrorLevel))

	//========================================把所有的output都汇聚成coreList,一次性初始化=====================================
	core := zapcore.NewTee(coreList...)

	//=======================================设置是否打印堆栈=======================================
	zapLogger := zap.New(core, zap.AddCaller(), zap.AddCallerSkip(1), zap.AddStacktrace(zapcore.ErrorLevel))

	return &ZapLog{Logger: zapLogger}

}
